package com.woniu.common.utils;

import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.MACSigner;
import com.nimbusds.jose.crypto.MACVerifier;

import java.text.ParseException;
import java.util.Map;

public class JWTUtil {

    public static final String KEY = "萨德；练腹肌；酸辣粉丁集路口；就是啊地方萨拉丁；泡温泉热离谱";

    public static String createJwt(Map<String, Object> map) throws JOSEException {
        // 通过java生成jwt
        // 组成部分：头部、载荷、签名
        // 1、生成头部
        JWSHeader build = new JWSHeader.Builder(JWSAlgorithm.HS256).type(JOSEObjectType.JWT).build();
        // 2、生成载荷，放用户信息的
        Payload payload = new Payload(map);
        // 3、生成签名，签名等于头部加载荷再加密钥
        JWSObject jwsObject = new JWSObject(build, payload);
        MACSigner macSigner = new MACSigner(KEY); // 填密钥进去
        jwsObject.sign(macSigner); // 利用密钥加密的方法
        // 对象序列化为字符串
        return jwsObject.serialize(); // 把生成好的jwt对象序列化成一个字符串
    }

    /**
     * 写一个用系统jwt密码解密的方法<br>
     * 防止有人伪造，保证传过来的jwt都是本系统生成的，因为本系统生成的都是一样的秘钥加密
     *
     * @param jwt
     * @return Boolean
     * @throws ParseException
     * @throws JOSEException
     */
    public static Boolean decrypt(String jwt) throws ParseException, JOSEException {
        JWSObject jwsObject = JWSObject.parse(jwt);
        MACVerifier macVerifier = new MACVerifier(KEY);
        return jwsObject.verify(macVerifier);
    }

    /**
     * 获取jwt的用户信息
     * Jwt的字符串，是jwt对象序列化来的
     * 反序列化：把字符串变成对象
     *
     * @param jwt
     * @return Map
     * @throws ParseException
     */
    public static Map<String, Object> getUserInfo(String jwt) throws ParseException {
        // 反序列化jwt字符串
        JWSObject jwtObject = JWSObject.parse(jwt);
        Payload payload = jwtObject.getPayload();
        // 得到载荷中的用户信息
        return payload.toJSONObject();
    }

}
